#include <string>
#include <iostream>

#include "Game.h"
#include "ResourceManager.h"
#include "Textura.h"
#include "Sonido.h"
#include "TileSet.h"


using namespace std;

#define RUTA_SONIDO "data/sonidos/"
#define RUTA_MUSICA "data/musica/"
#define RUTA_TEXTURA "data/texturas/"


ResourceManager::ResourceManager(void)
	{
	}
//todo Revisar esto un poco.

void ResourceManager::addRecurso(Recurso *r){
	recursos[r->getNombre()] = r;

}

Recurso *ResourceManager::getResource( string & ruta, RECURSOS::tipoFichero tipo )
	{
		string *rutaRecurso = getRoute(tipo);

		string path = rutaRecurso == NULL ? ruta : *rutaRecurso + ruta;
		delete rutaRecurso;

		Recurso *r = recursos[path];

		if (r == NULL){//si no lo tenemos...
			switch(tipo){
				case RECURSOS::MUSICA:
					r = cargarMusica(path);
				break;
				case RECURSOS::SONIDO:
					r = cargarSonido(path);
				break;
				case RECURSOS::TEXTURA:
					r = cargarTextura(path);
				break;
				default:
					return NULL;
				break;
			}
			recursos[path] = r;
		}

		

		r->add();
		

		return r;

	}

string *ResourceManager::getRoute(RECURSOS::tipoFichero tipo){
			switch(tipo){
			case RECURSOS::MUSICA:
				return new string(RUTA_MUSICA);
			break;
			case RECURSOS::SONIDO:
				return new string(RUTA_SONIDO) ;
			break;
			case RECURSOS::TEXTURA:
				return new string(RUTA_TEXTURA);
			break;
		}
			return NULL;
	}
Recurso* ResourceManager::cargarSonido(string & nombre){
	return new Sonido(nombre,g->getAudio(),false);
	}
Recurso* ResourceManager::cargarMusica(string & nombre){
	return new Sonido(nombre,g->getAudio(),true);
	
	}

Recurso* ResourceManager::cargarTextura(string & nombre){
	return new Textura(nombre,true);
	}

void ResourceManager::update(float tiempoJuego){
	hash_map<string,Recurso*>::iterator it;
	Recurso *r = NULL;

	for(it = recursos.begin(); it != recursos.end();){
		r = it->second;

		if (r->getUsos() < 1 && r->getTiempoFin() != 0.f && r->getTiempoFin() + TIEMPO_ELIMINACION < tiempoJuego){
			recursos.erase(it);
			delete r;
			return;
		}else{
			if (r->getUsos() < 1 && r->getTiempoFin() == 0.f)
				r->setTiempoFin(tiempoJuego);

			++it;
		}

	}
		

}

ResourceManager::~ResourceManager(void)
	{
	}